<?php

class Application_Permiso_ControlAcceso extends Zend_Controller_Plugin_Abstract
{
    protected $_auth;
    protected $_acl;

    /* ESTO HACE SI NO ESTOY LOGUEADO */
    const NO_AUTH_MODULE    = 'application';
    const NO_AUTH_CONTROLLER = 'index';
    const NO_AUTH_ACTION    = 'index';

    const NO_ACL_MODULE     = 'application';
    const NO_ACL_CONTROLLER  = 'error';
    const NO_ACL_ACTION     = 'permiso';

    /* ESTO HACE SI NO TENGO PERMISOS PERO ESTOY LOGUEADO */
    public function __construct()
    {
        $this->_auth = Zend_Auth::getInstance();
        $this->_acl = Zend_Registry::get( 'acl' );
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        if ($this->_auth->hasIdentity()) {
            $role = $this->_auth->getIdentity()->role;
        } else {
            $role = 'visita';
        }

        $module = $request->getModuleName();
        $controller = $request->getControllerName();
        $resource = $controller;
        $action = $request->getActionName();

        if (!$this->_acl->has($resource)) {
            $resource = null;
        } elseif ($resource == "usuarios" && ( $action == "borrar" 
                                            || $action == "ver" 
                                            || $action == "editar" 
                                            || $action == "cambiar-clave" )){
            $resource = new Application_Permiso_Usuarios();
            //como lo que recibo esun id tengo que sacar el nombre de ususario
            $id = $request->getParam('id');
            $usuarios = new Application_Model_DbTable_Usuarios();
            $usuario = $usuarios->obtenerUsuario($id)->usuario;
            //ahora asigno ese nombre a mi recurso
            $resource->usuario = $usuario;
        } elseif ($resource == "comentarios" && $action == "borrar"){
            $resource = new Application_Permiso_Comentarios();
            $id = $request->getParam('id');
            $comentarios = new Blog_Model_DbTable_Comentarios();
            $comentario = $comentarios->obtenerComentario($id);
            $creador = $comentario->findParentRow('Application_Model_DbTable_Usuarios', 'Creador')->usuario;
            //ahora asigno ese nombre a mi recurso
            $resource->creador = $creador;
        }
        
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
            if (!$this->_auth->hasIdentity()) {
                $module = self::NO_AUTH_MODULE;
                $controller = self::NO_AUTH_CONTROLLER;
                $action = self::NO_AUTH_ACTION;
            } else {
                $module = self::NO_ACL_MODULE;
                $controller = self::NO_ACL_CONTROLLER;
                $action = self::NO_ACL_ACTION;
            }
        }

        $request->setModuleName($module);
        $request->setControllerName($controller);
        $request->setActionName($action);
    }
}


